希望可以藉由Batch File可以讓擔任系統網管人員能夠更利於處理解決問題.
• 將多個指令置於同一檔案,讓OS一次執行
• 文字格式,由Windows的cmd.exe解讀
• 提供多種指令
o 批次指令(cmd.exe提供)
o 內部指令(cmd.exe提供)
o 外部指令(OS/User提供)
• 版本演進:DOS -> Win9x -> Win2000/WinXP
• 優點:cmd.exe為OS內建,通用、簡單、不用編譯。特別適用於文字檔處理。
• 缺點:速度不快、無法撰寫複雜動作
應用面
• 排程定時:GUI方式、批次檔版本
• 更改IP:GUI版本、批次版本
• 登入時變換桌面
• 自動收送信
• 自動登入bbs
• 自動ftp下載
• 自動化google查詢
• 自動化MP3壓縮
• 自動備份資料
• 自動化傳送簡訊
• ..............
常用指令
• 萬用字元: *.exe ????.bat
• 目錄: . .. nul
• cmd的DOS指令
o 檔案目錄指令:dir, copy, del, md, cd, rd ...
o 導向指令: |, >, <, >>
• cmd的批次指令
o for, if, set, goto, exit, echo ...
• 外部指令
o 篩選指令:more, findstr, sort
o 常用指令:telnet、ftp、ping、ipconfig、chkdsk、xcopy....
o 其他指令:開始/說明及支援/搜尋:"命令列參照"
CMD的DOS指令DEMO
• 啟動cmd.exe
o 開始/程式集/執行/輸入cmd.exe
• 建立一個叫mywork的目錄,並將工作目錄轉到mywork
o mkdir mywork & cd mywork
• 將c:\下的目錄列表存成dir.txt。
o dir /b /ad c:\ > dir.txt
• 尋找c:\winnt下,所有“setup”字樣的.txt檔(包含子目錄和子子目錄和.....)並排序存到my.txt
o dir /s c:\winnt\setup*.txt | sort > my.txt
• 尋找c:\winnt\comsetup.log中,有出現“dllhost”的那幾行(不分大小寫)
o findstr /i "call” c:\winnt\comsetup.log
• 請用echo在dir.txt後面附加上文字"=目錄列表紀錄="
o echo =目錄列表紀錄= >> dir.txt
• 以my.txt履寫dir.txt(不能有提示符號出現)
o copy /y my.txt dir.txt
實作:備份檔案
• 在c:\winnt下,把*.txt備份到c:\backup的目錄下
o 要求:在執行多次的情況下,每次都能執行完畢而無須使用者介入。
• 提示一:請由"說明及支援"查詢xcopy的用法
• 提示二:須自行建立好c:\backup的目錄
CMD的Batch指令
• 可將DOS指令們寫入一文字batch檔,並利用batch指令加強其功能
o 可執行重覆動作,簡化手動工作
o EX. backup.bat
• 處處可使用
o 只要有Windows即可使用
o 語法和指令都比C/Java和其他語言都簡單
o 撰寫時間短
systemroot
username
var1
......
cmd.exe
my_1.bat
systemroot
username
var2
......
cmd.exe
my_2.bat
批次檔格式
• 單純的文字檔。
• 將重覆指令整合為一個檔案。
• 以 .bat 或 .cmd 作為副檔名
mkdir mywork & cd mywork
dir /b /ad c:\ > dir.txt
dir /s c:\winnt\setup*.txt | sort > my.txt
findstr /i "call” c:\winnt\comsetup.log
echo =目錄列表紀錄= >> dir.txt
copy /y my.txt dir.txt
demo.bat
批次指令:基本顯示
• 顯示字串:echo
o 秀出hihi的字樣:echo hihi
o 關閉指令的顯示,但仍可顯示字樣:@echo hihi
o 關閉此後所有指令的顯示:@echo off
o 開始此後所有指令的顯示:@echo on
• 註解
o rem
• 標號
o :
o 配合goto 時使用
批次指令:變數
• 環境變數操作
o 一般用法:set var=henry
o 讀取var變數:echo %var%
o 顯示目前全部變數:set
o 數值運算:set /a var=3*2
o 使用者指定:set /p var=Please write something:
• 特殊系統變數:%windir% %cd% %date% %systemroot% %username%...
• 設定區域變數:setlocal/endlocal
windir
username
var
......
cmd.exe
my.bat
Setlocal/endlocal範例
call demo.bat
echo %id%
output : oct
set id=oct
call demo.bat
echo %id%
output : %id%
setlocal
set id=oct
endlocal
批次指令:流程控制
• if, else
o if %NUMBER_OF_PROCESSORS%==1 echo you've only one processor
o if not "%OS%"=="" @echo your os is %os%
o if "%abc%"=="" (echo nothing) else (echo yes)
How about if "%abc%"=="" echo nothing else (echo yes)
o if /i "a"=="A" echo a is the same as A
• 跳至:goto :label
• 暫停:pause
Example
:startpoint
set choice=2
if %choice%==1 (
dir /w
) else if %choice%==2(
type c:\boot.ini
) else (
goto :startpoint
)
:What's the result ?
實作:選單系統
What do you want (1/2/3/4) ?
1.列出本台電腦windows目錄下,所有S開頭的子目錄。
2. 找出windows\system32\eula.txt中,所有含 Microsoft 的文字行,排序後分頁輸出顯示。
3. 再來一次
4. 離開。
要求:畫面不能出現batch檔中的code
批次指令:特殊字元
• 括號:( ..... )
• pipe : |
• 導向: > >> <
• 特殊字元避開:
o & ()[]{}^=;!'+,`~ 加""表示為純字元,失去特殊意義
o &<>()@^| 加^表示為自身字元,失去特殊意義
• 注意:batch檔中把%視為特殊字元
o 要使用%的字元者,要寫成%%才行
o 指令列中的 %i ,在Batch中要寫成%%i
o 指令列中的3%2,在 Batch中要寫成3%%2
批次指令: For
• 重覆性處理
o for %i in (monkey dog monkey) do @echo I love %i
• 顯示目錄中的特定檔案
o for %j in (%windir%\*.txt) do type %j
• 從1顯示到100
o for /L %i in (1,1,100) do echo %i
• 列出目前所有的目錄
o for /D %i in (*) do echo %i
For /f 的使用!!!
• 將指定文檔逐行顯示
o for /f %i in (%windir%\system32\eula.txt) do @echo %i
• 剖析文字檔,抓出第2、3個區塊
o for /f “delims=, tokens=3,7" %i in (%windir%\svcpack.log) do @echo %i %j
• 剖析字串
o for /f "tokens=1,2,3,4" %i in ("my name is jtchen") do @echo your %j is %l, welcome!!
• 將執行結果視為文檔,進行剖析
o for /F %i in ('dir/b/ad') do echo %i
o 如果不要剖析呢?? (即希望整行輸出)
• 剖析輸出:秀出目前的環境變數
o for /f "delims== tokens=1" %a in ('set') do @echo %a